Release 10.1A: OpenEdge Getting Started:
Object-oriented Programming


Sample classes

This is the top-level user-defined super class for two class hierarchies and provides a common error handler and time-tracking methods for all classes that inherit from it:

CommonObj.cls
CLASS acme.myObjs.Common.CommonObj: 
    DEFINE PUBLIC VARIABLE timestamp AS DATETIME NO-UNDO.             /* 5 */ 
    METHOD PUBLIC VOID updateTimestamp( ): 
        timestamp = NOW. 
    END METHOD. 
    METHOD PROTECTED CLASS acme.myObjs.Common.ErrorObj ErrorHandler  
                                        (INPUT iObjType AS CHARACTER): 
        DEFINE VARIABLE rError AS CLASS acme.myObjs.Common.ErrorObj NO-UNDO. 
        rError = NEW acme.myObjs.Common.ErrorObj (INPUT iObjType). 
        RETURN rError. 
    END METHOD. 
END CLASS. 

This interface is implemented by the following class, acme.myObjs.CustObj:

IBusObj.cls
INTERFACE acme.myObjs.Interfaces.IBusObj: 
    METHOD PUBLIC VOID printObj ( ). 
    METHOD PUBLIC VOID logObj (INPUT filename AS CHARACTER). 
END INTERFACE. 

This class extends acme.myObjs.Common.CommonObj to provide general functionality for handling customers and is a super class for the acme.myObjs.NECustomer class, which handles New England customers:

CustObj.cls
CLASS acme.myObjs.CustObj INHERITS acme.myObjs.Common.CommonObj      /* 1 */ 
                          IMPLEMENTS acme.myObjs.Interfaces.IBusObj: 
    DEFINE PUBLIC VARIABLE iNumCusts AS INTEGER NO-UNDO. 
    DEFINE PROTECTED TEMP-TABLE ttCust NO-UNDO 
        FIELD CustNum LIKE Customer.CustNum 
        FIELD Name LIKE Customer.Name. 
    DEFINE PRIVATE VARIABLE rError  
        AS CLASS acme.myObjs.Common.ErrorObj NO-UNDO. 
    CONSTRUCTOR PUBLIC CustObj( ):                                   /* 2 */ 
        iNumCusts = 0. 
        /* Fill temp table and get row count */ 
        FOR EACH Customer WHERE CustNum < 15: 
            CREATE ttCust. 
            ASSIGN 
                ttCust.CustNum = Customer.CustNum 
                ttCust.Name = Customer.Name. 
                iNumCusts = iNumCusts + 1. 
        END. 
        rError = ErrorHandler("acme.MyObjs.CustObj").                /* 3 */ 
    END CONSTRUCTOR. 
    METHOD PUBLIC CHARACTER GetCustomerName(INPUT piCustNum AS INTEGER): 
        FIND ttCust WHERE ttCust.CustNum = piCustNum NO-ERROR. 
        IF AVAILABLE ttCust THEN DO: 
            RETURN ttCust.Name. 
        END. 
        ELSE DO: 
            rError:Alert("No Customer with that number exists"). 
            RETURN ?. 
        END. 
    END METHOD. 
    METHOD PUBLIC VOID CheckCredit( ): 
        DEFINE VARIABLE rCreditObj AS CLASS acme.myObjs.CreditObj NO-UNDO. 
        rCreditObj = NEW acme.myObjs.CreditObj( ). 
        IF VALID-OBJECT(rCreditObj) THEN DO: 
            FOR EACH Customer where CustNum < 15: 
                IF Customer.CreditLimit < 15000 THEN DO: 
                    rError:Alert("There is a problem with this Customer"). 
                    rCreditObj:creditAlert(Customer.CustNum). 
                END. 
            END. 
            DELETE OBJECT rCreditObj. 
        END. 
        ELSE DO:  
            rError:Alert("Unable to check credit"). 
        END. 
    END METHOD. 
    /* Must implement methods defined in interface */ 
    /* timestamp is a protected variable inherited from CommonObj */ 
    METHOD PUBLIC VOID printObj( ): 
        OUTPUT TO PRINTER. 
        DISPLAY timestamp. 
        FOR EACH ttCust: 
            DISPLAY ttCust. 
        END. 
        OUTPUT CLOSE. 
    END METHOD. 
    METHOD PUBLIC VOID logObj(INPUT fileName AS CHARACTER): 
        OUTPUT TO VALUE(fileName). 
        DISPLAY timestamp. 
        FOR EACH ttCust: 
            DISPLAY ttCust. 
        END. 
        OUTPUT CLOSE. 
    END METHOD. 
    DESTRUCTOR PUBLIC CustObj( ):                                    /* 6 */ 
        EMPTY TEMP-TABLE ttCust. 
        DELETE OBJECT rError. 
        rError = ?. 
    END DESTRUCTOR. 
END CLASS. 

This class extends acme.myObjs.CustObj to handle New England customers by overriding GetCustomerName( ) to return the customer’s E-mail address along with their name:

NECustomer.cls
CLASS acme.myObjs.NECustomer INHERITS acme.myObjs.CustObj:           /* 7 */ 
    DEFINE PROTECTED TEMP-TABLE ttEmail NO-UNDO 
        FIELD CustNum LIKE Customer.CustNum 
        FIELD Email AS CHARACTER. 
    CONSTRUCTOR PUBLIC NECustomer ( ): 
        /* Since there are no parameters to the super class's constructor 
           this constructor call is optional */ 
        SUPER( ).                                                    /* 8 */ 
        /* Code to initialize ttEmail */ 
    END CONSTRUCTOR. 
    /* Override method to always get customer name and email */ 
    METHOD PUBLIC OVERRIDE CHARACTER GetCustomerName                 /* 9 */ 
                                     (INPUT piCustNum AS INTEGER): 
        DEFINE VARIABLE CustName AS CHARACTER NO-UNDO. 
        CustName = SUPER:GetCustomerName(INPUT piCustNum). 
        FIND FIRST ttEmail WHERE ttEmail.CustNum = piCustNum. 
        RETURN CustName + ";" + ttEmail.Email. 
    END METHOD. 
END CLASS. 

This class provides various support methods for other classes:

HelperClass.cls
CLASS acme.myObjs.Common.HelperClass: 
    DEFINE PRIVATE VARIABLE rCustObj AS CLASS acme.myObjs.CustObj NO-UNDO. 
    DEFINE PRIVATE VARIABLE rError  
        AS CLASS acme.myObjs.Common.ErrorObj NO-UNDO. 
    DEFINE PROTECTED TEMP-TABLE ttCustNames NO-UNDO 
        FIELD CustNum AS INTEGER 
        FIELD CustName AS CHARACTER. 
    CONSTRUCTOR PUBLIC HelperClass ( ): 
        rError = NEW acme.myObjs.Common.ErrorObj 
                                (INPUT "acme.myObjs.Common.HelperClass"). 
    END CONSTRUCTOR. 
    METHOD PUBLIC VOID ListDate 
                       (INPUT rObject AS CLASS acme.myObjs.Common.CommonObj): 
        /* Timestamp this object */ 
        IF VALID-OBJECT(rObject) THEN 
            rObject:updateTimestamp( ). 
        ELSE 
            rError:Alert("Not a valid object"). 
    END METHOD. 
    METHOD PUBLIC VOID ListNames  
                       (INPUT-OUTPUT prCustObj AS CLASS acme.myObjs.CustObj): 
        DEFINE VARIABLE i AS INTEGER NO-UNDO. 
        DO i = 1 to prCustObj:iNumCusts: 
            CREATE ttCustNames. 
            ASSIGN 
                ttCustNames.CustName = prCustObj:GetCustomerName(INPUT i) 
                ttCustNames.CustNum  = i. 
        END. 
        rCustObj = prCustObj. 
        prCustObj = NEW acme.myObjs.CustObj( ). 
    END METHOD. 
    METHOD PUBLIC VOID ReportOutput 
            (OUTPUT prInterface AS CLASS acme.myObjs.Interfaces.IBusObj): 
        /* Send the PRIVATE CustObj instance back to be printed */ 
        IF VALID-OBJECT(rCustObj) THEN 
            prCustObj = rCustObj. 
        ELSE 
            rError:Alert("Not a valid object"). 
    END METHOD. 
    DESTRUCTOR PUBLIC HelperClass ( ): 
        DELETE OBJECT rError. 
        rError = ?. 
    END DESTRUCTOR. 
END CLASS. 

This class provides a method for notification of customers who have exceeded their credit limit:

CreditObj.cls
CLASS acme.myObjs.CreditObj INHERITS acme.myObjs.Common.CommonObj: 
    METHOD PUBLIC VOID creditAlert(INPUT piCustNum AS INTEGER): 
        FIND FIRST Customer WHERE Customer.CustNum = piCustNum NO-ERROR. 
        IF AVAILABLE(Customer) THEN 
            MESSAGE Customer.Name " is on Credit Hold" SKIP 
                    "with a credit limit of " Customer.CreditLimit 
                    VIEW-AS ALERT-BOX. 
    END METHOD. 
END CLASS. 

This class provides a common mechanism together with the ErrorHandler( ) method in acme.myObjs.Common.CommonObj for other classes to store and report error information:

ErrorObj.cls
CLASS acme.myObjs.Common.ErrorObj: 
    DEFINE PRIVATE VARIABLE ObjType AS CHARACTER NO-UNDO. 
    CONSTRUCTOR PUBLIC ErrorObj (INPUT rObjType AS CHARACTER): 
        ObjType = rObjType. 
    END CONSTRUCTOR. 
   
    METHOD PUBLIC VOID Alert (INPUT ErrorString AS CHARACTER): 
        MESSAGE "Error in " ObjType "!" SKIP 
                ErrorString  
                VIEW-AS ALERT-BOX. 
    END METHOD. 
END CLASS. 

This class is the main driver for running all the other sample classes:

Main.cls
CLASS Main: 
    DEFINE PRIVATE VARIABLE rCustObj 
        AS CLASS acme.myObjs.CustObj NO-UNDO. 
    DEFINE PRIVATE VARIABLE rCustObj2 
        AS CLASS acme.myObjs.CustObj NO-UNDO. 
    DEFINE PRIVATE VARIABLE rCommonObj 
        AS CLASS acme.myObjs.Common.CommonObj NO-UNDO. 
    DEFINE PRIVATE VARIABLE rIBusObj 
        AS CLASS acme.myObjs.Interfaces.IBusObj NO-UNDO. 
    DEFINE PRIVATE VARIABLE rHelperClass 
        AS CLASS acme.myObjs.Common.HelperClass NO-UNDO. 
    CONSTRUCTOR PUBLIC Main( ): 
        /* Create an instance of the HelperClass class */ 
        rHelperClass = NEW acme.myObjs.Common.HelperClass( ). 
        /* Create an instance of the CustObj class */ 
        rCustObj = NEW acme.myObjs.CustObj( ). 
    END CONSTRUCTOR. 
    METHOD PUBLIC VOID ObjectInfo( ): 
        rHelperClass:ListDate(INPUT rCustObj).                      /* 4 */ 
        MESSAGE rCustObj:timestamp. 
        rCommonObj = rCustObj. 
        rHelperClass:ListNames(INPUT-OUTPUT rCustObj). 
        rCustObj:CheckCredit( ). 
        rCustObj2 = rCustObj. 
        rHelperClass:ReportOutput(OUTPUT rIBusObj). 
        rIBusObj:logObj(INPUT "CustomerObj.out"). 
        rIBusObj = rCustObj. 
    END METHOD. 
    DESTRUCTOR PUBLIC Main( ): 
        DELETE OBJECT rCustObj. 
        rCustObj = ?. 
        DELETE OBJECT rHelperClass. 
        rHelperClass = ?. 
    END DESTRUCTOR. 
END CLASS. 


Copyright © 2005 Progress Software Corporation
www.progress.com
Voice: (781) 280-4000
Fax: (781) 280-4095